class Rectangle:
    '''
        这是一个表示矩形的类
    '''

    def __init__(self, widght, height):
        self.hidden_widght = widght
        self.hidden_height = height

    def get_widght(self):
        return self.hidden_widght

    def get_height(self):
        return self.hidden_height

    def set_widght(self, widght):
        self.hidden_widght = widght

    def set_hidght(self, hidght):
        self.hidden_hidght = hidght

    def get_area(self):
        return self.hidden_widght * self.hidden_height


# r = Rectangle(2, 5)
# r.set_hidght(10)
# r.set_widght(20)
# print(r.get_area())

# 可以为对象的属性使用双下划线开头，__xxx
# 双下划线开头的属性，是对象的隐藏属性，隐藏属性只能在类的内部访问，无法通过对象访问
# 其实隐藏属性只不过是Python自动为属性改了一个名字
#   实际上是将名字修改为了：_类名__属性名 比如：__name -> _Person__name
# class Person:
#     def __init__(self, name):
#         self.__name = name

#     def get_name(self):
#         '''
#             get_name()用来获取对象的name属性
#         '''
#         # print('用户获取了属性')
#         return self.__name

#     def set_name(self, name):
#         '''
#             set_name()用来修改对象的name属性
#         '''
#         # print('用户修改了属性')
#         self.__name = name

# p = Person('swk')
# print(p.__name)
# print(p.__name) __开头的属性是隐藏属性，无法通过对象访问
# p.__name('zbj')
# print(p._Person__name)
# p._Person__name = 'zbj'

# print(p.get_name())


# 使用__开头的属性，实际上依然可以在外部访问，所以这种方式我们一般不用
# 一般我们将一些私有属性（不希望被外部访问的属性）以_开头
# 一般情况下，使用_开头的属性都是私有属性，没有特殊要求不要修改
class Person:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        '''
            get_name()用来获取对象的name属性
        '''
        # print('用户获取了属性')
        return self._name

    def set_name(self, name):
        '''
            set_name()用来修改对象的name属性
        '''
        # print('用户修改了属性')
        self._name = name


p = Person('swk')

print(p._name)
